package com.donaldy.litestruts;

import org.jdom2.Document;
import org.jdom2.Element;
import org.jdom2.JDOMException;
import org.jdom2.input.SAXBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * Created by donal on 2017/3/21.
 */
public class Configuration {

    Map<String,ActionConfig> actions = new HashMap<>();

    public Configuration(String fileName) {

        String packageName = this.getClass().getPackage().getName();

        packageName = packageName.replace('.', '/');

        InputStream is = this.getClass().getResourceAsStream("/" + packageName + "/" + fileName);

        parseXML(is);

        try {
            is.close();
        } catch (IOException e) {
            throw new ConfigurationException(e);
        }
    }

    private void parseXML(InputStream is){

        SAXBuilder builder = new SAXBuilder();

        try {

            Document doc = builder.build(is);

            Element root = doc.getRootElement();

            for(Element actionElement : root.getChildren("action")){

                String actionName = actionElement.getAttributeValue("name");
                String clzName = actionElement.getAttributeValue("class");

                ActionConfig ac = new ActionConfig(actionName, clzName);

                for(Element resultElement : actionElement.getChildren("result")){

                    String resultName = resultElement.getAttributeValue("name");
                    String viewName = resultElement.getText().trim();

                    ac.addViewResult(resultName, viewName);

                }

                this.actions.put(actionName, ac);
            }


        } catch (JDOMException e) {
            throw new ConfigurationException(e);

        } catch (IOException e) {
            throw new ConfigurationException(e);

        }


    }

    public String getClassName(String action) {
        ActionConfig ac = this.actions.get(action);
        if(ac == null){
            return null;
        }
        return ac.getClassName();
    }

    public String getResultView(String action, String resultName) {
        ActionConfig ac = this.actions.get(action);
        if(ac == null){
            return null;
        }
        return ac.getViewName(resultName);
    }

    //之所以为内部类，至少现在看来外界并不需要。
    private static class ActionConfig {
        String name;
        String clzName;
        Map<String, String> viewResult = new HashMap<>();

        public ActionConfig (String actionName, String clzName) {
            this.name = actionName;
            this.clzName = clzName;
        }

        public String getClassName () {
            return clzName;
        }

        public void addViewResult (String name, String viewName) {
            viewResult.put(name, viewName);
        }
        public String getViewName(String resultName){
            return viewResult.get(resultName);
        }
    }
}
